package com.geovis.emergency.spd.biz.pc.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.geovis.common.mybatis.page.PageParam;
import com.geovis.common.mybatis.page.PageResult;
import com.geovis.emergency.spd.entity.pc.entity.PcDrill;
import com.geovis.emergency.spd.entity.pc.pojo.dto.PcDrillQueryDTO;
import com.geovis.emergency.spd.entity.pc.pojo.dto.PcDrillSaveDTO;
import com.geovis.emergency.spd.entity.pc.pojo.dto.PcDrillUpdateDTO;
import com.geovis.emergency.spd.entity.pc.pojo.vo.DrillStatisticsVO;
import com.geovis.emergency.spd.entity.pc.pojo.vo.PcDrillVO;
import com.geovis.emergency.spd.entity.system.entity.SystemUserRole;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 应急预案指挥模块-演练表 服务类
 * </p>
 *
 * @author 曾德实
 * @since 2022-04-30
 */
public interface IPcDrillService extends IService<PcDrill> {

    /**
     * 新增演练
     *
     * @param saveDTO
     */
    void savePcDrill(PcDrillSaveDTO saveDTO);

    /**
     * 更新演练
     * @param updateDTO
     */
    void updatePcDrill(PcDrillUpdateDTO updateDTO);
    /**
     * 分页查询
     *
     * @param pageParam
     * @return
     */
    PageResult listPage(PageParam<PcDrillQueryDTO> pageParam);

    /**
     * 列表查询
     *
     * @param pageParam
     * @return
     */
    List<PcDrill> getList(PcDrillQueryDTO pageParam);

    /**
     * 演练详情
     * @param drillId
     * @return
     */
    PcDrillVO detailPcDrill(String drillId);

    /**
     * 启动演练
     *
     * @param drillId
     */
    void startPcDrill(String drillId);

    /**
     * 结束演练
     * @param drillId
     */
    void endPcDrill(String drillId);

    /**
     * 结束演练前校验是否任务未执行
     * @param drillId
     * @return
     */
    String checkBeforeEndPcDrill(String drillId);

    /**
     * 分页查询用户相关的历史演练数据 (非正在进行的，已结束的演练)
     * @param userId 用户id
     * @param status 演练状态
     * @return
     */
    PageResult<PcDrill> getHistoryDrill(PageParam<PcDrillQueryDTO> pageParam,String userId, String status);

    /**
     * 克隆演练
     * @param drillId
     */
    String clonePcDrill(String drillId);

     Set<SystemUserRole> getDrillUserRoles(String drillId);


    DrillStatisticsVO drillStatistics(String drillId);

    /**
     * 校验已启动或未启动的演练，是否含有该用户
     */
    String checkDrillExistUsers(Set<String> userIds);

    /**
     * 新增演练
     */
    void deleteDrill(Set<String> ids);
}
